package com.gitee.yusugar.core.util;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.gitee.yusugar.common.YuToolServiceException;

/**
 * 文件上传类（我们会在上传文件时，帮你生成 年-月-日-时 作为图片路径）
 * - 1. 使用 spring 帮你注入 path 属性（文件上传的整体路径：file.upload.path）
 * -    例：配置的时候，只需配置到需要截取的路径即可，结尾带上 "/"；D:/ytool/upload/
 * - 2. 使用 spring 帮你注入 cutPath 属性（文件截取路径：file.upload.cut-path）
 * -    例：文件上传路径：D:/ytool/upload/2022/1/1/1.jpg；此时 cutPath 若传入 upload，则在上传文件后，只会返回 upload 往后的路径（包含upload）
 * -    返回：upload/2022/1/1/1.jpg
 * - 3. 使用 spring 帮你注入 accessAddr 属性（文件访问路径：file.upload.accessAddr）
 * -    例：accessAddr = http://192.168.10.1:8080；则会在上传图片成功后，默认给你返回  http://192.168.10.1:8080/upload/2022/1/1/1.jpg 可访问的路径
 */
public class FileUtil {

    public static String path;

    public static String cutPath;

    public static String accessAddr;

    /**
     * 将文件写出到磁盘，返回剪切后的路径
     *
     * @param fileData     文件数据
     * @param suffixOrName 文件后缀
     * @return 结果
     */
    public static String writeBytesAddrNot( byte[] fileData, String suffixOrName ) {
        return writeBytes( fileData, suffixOrName, true, false );
    }

    /**
     * 将文件写出到磁盘，并返回文件的磁盘路径
     *
     * @param fileData     文件数据
     * @param suffixOrName 文件后缀
     * @return 结果
     */
    public static String writeBytesAllNot( byte[] fileData, String suffixOrName ) {
        return writeBytes( fileData, suffixOrName, false, false );
    }

    /**
     * 将文件写出到磁盘（自动判断是否“截取文件路径”与“拼接文件访问路径”）
     *
     * @param fileData     文件数据
     * @param suffixOrName 文件后缀
     * @return 结果
     */
    public static String writeBytes( byte[] fileData, String suffixOrName ) {
        return writeBytes( fileData, suffixOrName, StrUtil.isNotBlank( cutPath ), StrUtil.isNotBlank( accessAddr ) );
    }

    /**
     * 将文件写出到磁盘
     *
     * @param fileData     文件数据
     * @param suffixOrName 文件后缀（也可传入文件名，默认截取最后 一个 “.” 的后缀）
     * @param isCut        是否截取文件路径
     * @param isJointAddr  文件访问路径
     * @return 结果
     */
    public static String writeBytes( byte[] fileData, String suffixOrName, boolean isCut, boolean isJointAddr ) {
        YuToolServiceException.throwBy( StrUtil.isBlank( path ), "文件上传路径为空!" );
        YuToolServiceException.throwBy( StrUtil.isBlank( suffixOrName ), "文件名/后缀不能为空!" );

        String writePath = path + randomPathAndName() + suffixOrName.substring( suffixOrName.lastIndexOf( "." ) );
        cn.hutool.core.io.FileUtil.writeBytes( fileData, writePath );

        if ( isCut )
            writePath = writePath.substring( writePath.indexOf( cutPath ) );

        if ( isJointAddr )
            writePath = accessAddr + writePath;

        return writePath;
    }

    /**
     * 生成文件路径和文件名（不带后缀）
     *
     * @return 生成的文件路径
     */
    private static String randomPathAndName() {
        return DateUtil.thisYear() + "/" + DateUtil.thisMonth() + "/" + DateUtil.thisDayOfMonth() + "/" +
                DateUtil.thisHour( true ) + "/" + System.currentTimeMillis() + IdUtil.objectId();
    }
}
